package main

import (
	"fmt"
	"runtime"
	"sync"
)

//这个程序给人的感觉是串行的，原因是当调度器还没有准备切换打印小写字母的goroutine时，
// 打印大写字母的goroutine就执行完了。
func main() {
	// 指定调度器所能所能调度的逻辑处理器的数量
	runtime.GOMAXPROCS(1)

	// 使用wg等待程序执行完成
	var wg sync.WaitGroup

	wg.Add(2)

	fmt.Println("start goroutine")

	// 声明一个匿名函数， 使用go关键字创建goroutine
	go func() {
		// 函数退出时通过Done通知main函数工作已经完成
		defer wg.Done()
		// 打印小写英文字符3次
		for i := 1; i <= 3; i++ {
			for char := 'a'; char < 'a'+26; char++ {
				fmt.Printf("%c ", char)
			}
			fmt.Print("\n")
		}

	}()

	go func() {
		defer wg.Done()
		// 打印大写英文字符3次
		for i := 1; i <= 3; i++ {
			for char := 'A'; char < 'A'+26; char++ {
				fmt.Printf("%c ", char)
			}
			fmt.Print("\n")
		}
	}()

	//等待goroutine结束
	fmt.Println("Waiting for finish")
	wg.Wait()

	fmt.Println("program end")
}
